Preprocesamiento de datos#
La limpieza de datos es un paso crítico en el desarrollo de modelos de machine learning, ya que garantiza que los datos utilizados para entrenar y evaluar los modelos sean precisos, confiables y representativos, lo que a su vez mejora la calidad y la eficacia de los modelos resultantes.
import pandas as pd
from numpy import NaN
import numpy as np
import requests
import plotly.express as px
import os
df = pd.read_csv("Data/raw_data.csv",low_memory=False)
df.head()
| Unnamed: 0 | departamento | municipio | codigo_dane | armas_medios | fecha_hecho | genero | grupo_etario | cantidad | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 299006 | ANTIOQUIA | AMAGÁ | 5030000 | ARMA BLANCA / CORTOPUNZANTE | 2019-01-01 | FEMENINO | ADULTOS | 1 |
| 1 | 299007 | ANTIOQUIA | EL SANTUARIO | 5697000 | ARMA BLANCA / CORTOPUNZANTE | 2019-01-01 | FEMENINO | ADULTOS | 1 |
| 2 | 299008 | ANTIOQUIA | MEDELLÍN (CT) | 5001000 | ARMA BLANCA / CORTOPUNZANTE | 2019-01-01 | MASCULINO | ADULTOS | 2 |
| 3 | 299009 | ANTIOQUIA | NARIÑO | 5483000 | ARMA BLANCA / CORTOPUNZANTE | 2019-01-01 | FEMENINO | ADULTOS | 1 |
| 4 | 299010 | ATLÁNTICO | BARRANQUILLA (CT) | 8001000 | ARMA BLANCA / CORTOPUNZANTE | 2019-01-01 | FEMENINO | ADULTOS | 3 |
Ajustes para columnas, valores nulos y duplicados
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 276715 entries, 0 to 276714
Data columns (total 9 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Unnamed: 0 276715 non-null int64
1 departamento 276715 non-null object
2 municipio 276715 non-null object
3 codigo_dane 276715 non-null object
4 armas_medios 276715 non-null object
5 fecha_hecho 276715 non-null object
6 genero 276715 non-null object
7 grupo_etario 275104 non-null object
8 cantidad 276715 non-null int64
dtypes: int64(2), object(7)
memory usage: 19.0+ MB
Eliminamos la columna Codigo_dane, ya que representa el identificador del caso registrado. No es útil para el análisis.
df = df.drop(['codigo_dane','Unnamed: 0'],axis=1)
Tratamiento de Datos Faltantes y Atípicos#
df.isnull().sum()
departamento 0
municipio 0
armas_medios 0
fecha_hecho 0
genero 0
grupo_etario 1611
cantidad 0
dtype: int64
fig = px.box(df, x = 'grupo_etario', y = 'cantidad', title="Cantidad de Casos por Grupo Etario", notched = False)
fig.show()
Este gráfico muestra la distribución de los casos por grupos etarios (adultos, adolescentes, menores y no reportados). Lo más notable es el pico extremadamente alto en la categoría “ADULTOS”, que indica que este grupo representa una proporción muy significativa de los casos totales en comparación con los demás grupos. En contraste, los grupos de “ADOLESCENTES”, “MENORES” y “NO REPORTADO” tienen valores mucho más bajos, sugiriendo que tienen una presencia mucho menor en el total de casos.
fig = px.box(df, x = 'genero', y = 'cantidad', title="Cantidad de Casos por Género", notched = True)
fig.show()